package com.jf.cloud.service.sysmanager.common.util;


import java.text.DecimalFormat;
import java.text.NumberFormat;

import com.jf.cloud.service.sysmanager.constant.SysConstant;

/**
 * 数字处理工具类
 * 
 */
public final class NumberUtil {

	public static final String LONG_PATTERN_DEFAULT = "#,##0";

	public static final String DOUBLE_PATTERN_DEFAULT = "#,##0.00";

	public static final String CURRENCY_PATTERN_DEFAULT = "#,##0.00";

	public static final String PERCENT_PATTERN_DEFAULT = "#,##0.00%";

	/**
	 * 按标准化的数字表现方式格式化长型数字样式，默认格式("#,##0")
	 * 
	 * @param number
	 *            被格式化的数字
	 * @return String 返回标准化的长型数字样式("#,##0")
	 */
	public static String numberFormat(long number) {
		return numberFormat(number, LONG_PATTERN_DEFAULT);
	}

	/**
	 * 按标准化的数字表现方式格式化长型数字样式
	 * 
	 * @param number
	 *            被格式化的数字
	 * @param pattern
	 *            格式化的模板
	 * @return String 返回标准化的长型数字样式（如"#,##0")
	 */
	public static String numberFormat(long number, String pattern) {
		if (pattern == null || pattern.length() == 0) {
			return numberFormat(number);
		} else {
			NumberFormat numberFormat = new DecimalFormat(pattern);
			return numberFormat.format(number);
		}
	}

	/**
	 * 按标准化的数字表现方式格式化浮点型数字样式，默认格式（"#,##0.00")
	 * 
	 * @param number
	 *            被格式化的double型数字
	 * @return String 返回标准化的长型数字样式（"#,##0.00")
	 */
	public static String numberFormat(double number) {
		return numberFormat(number, DOUBLE_PATTERN_DEFAULT);
	}

	/**
	 * 按标准化的数字表现方式格式化浮点型数字样式
	 * 
	 * @param number
	 *            被格式化的double型数字
	 * @param pattern
	 *            格式化的模板
	 * @return String 返回标准化的长型数字样式（如"#,##0.00")
	 */
	public static String numberFormat(double number, String pattern) {
		if (pattern == null || pattern.length() == 0) {
			return numberFormat(number);
		} else {
			NumberFormat numberFormat = new DecimalFormat(pattern);
			return numberFormat.format(number);
		}
	}

	/**
	 * 按标准化的货币表现方式格式化数字(浮点型)样式，默认格式（"#,##0.00")
	 * 
	 * @param number
	 *            被格式化的数字
	 * @return String 返回标准化的数字(浮点型)样式（"#,##0.00")
	 */
	public static String currencyFormat(double number) {
		return currencyFormat(number, CURRENCY_PATTERN_DEFAULT);
	}

	/**
	 * 按标准化的货币表现方式格式化数字(浮点型)样式
	 * 
	 * @param number
	 *            被格式化的数字
	 * @param pattern
	 *            格式化的模板
	 * @return String 返回标准化的数字(浮点型)样式（如"#,##0.00")
	 */
	public static String currencyFormat(double number, String pattern) {
		if (pattern == null || pattern.length() == 0) {
			return currencyFormat(number);
		} else {
			NumberFormat numberFormat = new DecimalFormat(pattern);
			return numberFormat.format(number);
		}
	}

	/**
	 * 按标准化的百分比表现方式格式化数字(浮点型)样式，默认格式（"#,##0.00%")
	 * 
	 * @param number
	 *            被格式化的数字
	 * @return String 返回标准化的数字(浮点型)样式（如"#,##0.00%")
	 */
	public static String percentFormat(double number) {
		return percentFormat(number, PERCENT_PATTERN_DEFAULT);
	}

	
	/**
	 * 按标准化的百分比表现方式格式化数字(浮点型)样式
	 * 
	 * @param number 被格式化的数字
	 * @param pattern 格式化的模板
	 * @return String 返回标准化的数字(浮点型)样式（如"#,##0.00%")
	 */
	public static String percentFormat(double number, String pattern) {
		if (pattern == null || pattern.length() == 0) {
			return percentFormat(number);
		} else {
			NumberFormat numberFormat = new DecimalFormat(pattern);
			return numberFormat.format(number);
		}
	}
    
	
	/**
	 * 四舍五入得到 单价 （按系统配置的 位数 默认 5位小数） [ 重载方法 参数为字符串]
	 * @author ouyang 创建时间：Feb 11, 2012 1:28:49 AM
	 */
	public static double getPrice(String numberStr) {
		Double number = Double.parseDouble(numberStr);
		return getPrice(number);
	}
	/**
	 * 四舍五入得到 单价 （按系统配置的 位数 默认 5位小数）
	 * @author ouyang 创建时间：Feb 11, 2012 1:28:49 AM
	 */
	public static double getPrice(Double number) {
		if(number==null || number.doubleValue()<0){
			throw new RuntimeException("单价不正确 "+number);
		}
		return NumberUtilHelper.round(number, SysConstant.PRICE_SCALE);
	}
	
	/**
	 * 四舍五入得到 总价 （按系统配置的 位数 默认 2位小数）
	 * @author ouyang 创建时间：Feb 11, 2012 1:28:49 AM
	 */
	public static double getTotalPrice(Double number) {
		if(number==null || number.doubleValue()<0){
			throw new RuntimeException("总价不正确 "+number);
		}
		return NumberUtilHelper.round(number, SysConstant.TOTAL_PRICE_SCALE);
	}
	/**
	 * 四舍五入得到 总价 （按系统配置的 位数 默认 2位小数） [参数为字符串]
	 * @author ouyang 创建时间：Feb 11, 2012 1:28:49 AM
	 */
	public static double getTotalPrice(String numberStr) {
		Double number = Double.parseDouble(numberStr);
		return getTotalPrice(number);
	}
}
